// 简答题 
// 一、说出输出结果，解释为什么
var a = []
for (var i = 0; i < 10; i++) {
    a[i] = function() {
        console.log(i)
    }
}
a[6]() // 10
// 变量提升，i是全局执行栈中的变量，每次循环都分出一个堆内存用于存放函数，但是i是全局执行栈中的变量， 最后循环i变成了10，这时候调用执行栈中的某个函数，查找的i是已经循环结束的i 为10


// 二、 执行结果， 为什么
var tmp = 123
if (true) {
    console.log(tmp)
    // let tmp
}
// 暂时性死区，会报错
// 原因：在代码块中，如果有let声明，那么let声明之前，该变量是不可用的，在语法上这称之为暂时性死区

// 三、ES6语法， 找出数组中最小的值，用最简单的方法
var arr = [11,34,32,89,4]
console.log(Math.min(...arr))

// 四、var、let、const 三种声明具体差别
// var 会涉及到变量提升
// let 是作用域块儿内的变量声明方式， 如果在生命前使用变量会报错，是暂时性死区
// const 一般用于定义常量，初始值必须有
// var、let声明后可以变化，const不能变
// let和const是作用域块在大括号下，而var作用于函数作用域或全局作用域


// 五、下列代码最终输出结果
var a = 10
var obj = {
    a: 20,
    fn() {
        setTimeout(() => {
            console.log(this.a)
        })
    }
}
obj.fn() // 20
// this的指向是函数被执行时确定的，也就是执行上下文被创建时确定的 fn被obj调用，作用域时obj，所以this.a 会在obj的执行上下文寻找a


// 六、简述symbol类型的用途
// Symbol 唯一的用途就是标识对象属性，表明对象支持的功能。 相比于字符属性名，Symbol 的区别在于唯一，可避免名字冲突。


// 七、什么是浅拷贝，什么是深拷贝
// 浅拷贝只是复制了引用指针地址，新旧对象还是共享的一个内存，深拷贝是完全创建一个新的对象，一个内存空间去存放，修改新的对象不会影响旧的对象

// 八、 简述TS和JS之间的关系
// TS是JS的超集 添加了已选的静态类型系统和很多尚未发布的ECMAScript新特性，最终会被编译成js

// 九、请谈谈TS的优缺点
// ts的好处：增加可读性和可维护性，强类型的系统可以在开发中就发现大量的错误；包容性比较好，js文件可以直接改成ts文件，不定义类型可以推论出类型
// ts的缺点：增加了学习的成本，需要理解接口、泛型等知识点；短期项目增加成本，但是降低了可维护成本；集成到构建需要一定的工作量；和有些库结合的不适合很完美


// 十、引用计数的原理和优缺点
// 原理：设置引用数，引用关系变化时修改引用数，判断引用数是否为0去做回收操作
// 优点：发现垃圾时立即回收，最大限度的减少程序暂停的几率
// 缺点：无法回收循环引用的对象；时间开销大

// 十一、描述标记整理算法的工作流程
// 该算法分为标记和整理两个阶段，标记阶段会遍历并标记活动对象，整理阶段通过数次搜索堆来重新装填活动对象，它们聚集到了堆的一端。


// 十二、描述v8中新生代存储区垃圾回收的流程
// 首先将From空间中所有能从根对象到达的对象复制到To区，然后维护两个To区的指针scanPtr和allocationPtr，分别指向即将扫描的活跃对象和即将为新对象分配内存的地方，开始循环。循环的每一轮会查找当前scanPtr所指向的对象，确定对象内部的每个指针指向哪里。如果指向老生代我们就不必考虑它了。如果指向From区，我们就需要把这个所指向的对象从From区复制到To区，具体复制的位置就是allocationPtr所指向的位置。复制完成后将scanPtr所指对象内的指针修改为新复制对象存放的地址，并移动allocationPtr。如果一个对象内部的所有指针都被处理完，scanPtr就会向前移动，进入下一个循环。若scanPtr和allocationPtr相遇，则说明所有的对象都已被复制完，From区剩下的都可以被视为垃圾，可以进行清理了


// 十三、增量标记算法在何时使用及工作原理

// 将一整段垃圾回收操作分成几个小段
// 垃圾回收与程序执行交替完成
// 程序执行一段时间后，产生垃圾对象，开始遍历对象进行标记，第一次标记可能就标记第一层活动对象，第二次标记所有活动对象，最后对空间进行回收。